home *** CD-ROM | disk | FTP | other *** search
/ Aminet 51 / Aminet 51 (2002)(GTI - Schatztruhe)[!][Oct 2002].iso / Aminet / dev / c / TinyGL.lha / tinygl / src / specbuf.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-01-07  |  1.4 KB  |  53 lines

  1. #include "zgl.h"
  2. #include "msghandling.h"
  3. #include <math.h>
  4. #include <stdlib.h>
  5.  
  6. static void calc_buf(GLSpecBuf *buf, const float shininess)
  7. {
  8.   int i;
  9.   float val, inc;
  10.   val = 0.0f;
  11.   inc = 1.0f/SPECULAR_BUFFER_SIZE;
  12.   for (i = 0; i <= SPECULAR_BUFFER_SIZE; i++) {
  13.     buf->buf[i] = pow(val, shininess);
  14.     val += inc;
  15.   }
  16. }
  17.  
  18. GLSpecBuf *
  19. specbuf_get_buffer(GLContext *c, const int shininess_i, 
  20.                    const float shininess)
  21. {
  22.   GLSpecBuf *found, *oldest;
  23.   found = oldest = c->specbuf_first;
  24.   while (found && found->shininess_i != shininess_i) {
  25.     if (found->last_used < oldest->last_used) {
  26.       oldest = found;
  27.     }
  28.     found = found->next; 
  29.   }
  30.   if (found) { /* hey, found one! */
  31.     found->last_used = c->specbuf_used_counter++;
  32.     return found;
  33.   }
  34.   if (oldest == NULL || c->specbuf_num_buffers < MAX_SPECULAR_BUFFERS) {
  35.     /* create new buffer */
  36.     GLSpecBuf *buf = gl_malloc(sizeof(GLSpecBuf));
  37.     if (!buf) gl_fatal_error("could not allocate specular buffer");
  38.     c->specbuf_num_buffers++;
  39.     buf->next = c->specbuf_first;
  40.     c->specbuf_first = buf;
  41.     buf->last_used = c->specbuf_used_counter++;
  42.     buf->shininess_i = shininess_i;
  43.     calc_buf(buf, shininess);
  44.     return buf;     
  45.   }
  46.   /* overwrite the lru buffer */
  47.   /*tgl_trace("overwriting spec buffer :(\n");*/
  48.   oldest->shininess_i = shininess_i;
  49.   oldest->last_used = c->specbuf_used_counter++;
  50.   calc_buf(oldest, shininess);
  51.   return oldest;
  52. }
  53.